## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.6     v dplyr   1.0.7
## v tidyr   1.1.4     v stringr 1.4.0
## v readr   2.1.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
## 
## Attaching package: 'summarytools'
## The following object is masked from 'package:tibble':
## 
##     view
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric

1 Análisis descriptivo

La base de datos que se va a emplear para proyectar el número de vehículos a registrar en el Registro Único Nacional de Tránsito, RUNT contiene un registro del número de vehículos que han sido registrados diariamente entre el primero de enero de 2012 (2012-01-01) y el 31 de diciembre de 2017 (2017-12-31), lo que implica que parte con solo dos variables: la fecha y el número de vehículos registrados en el RUNT en cada fecha, con 2,192 observaciones que abarcan la totalidad de días que transcurrieron entre las dos fechas límite. Con esto claro, se desarrolla la siguiente serie de tiempo que ilustra el número de vehículos registrados por día.

## Rows: 2,192
## Columns: 2
## $ Fecha    <dttm> 2012-01-01, 2012-01-02, 2012-01-03, 2012-01-04, 2012-01-05, ~
## $ Unidades <dbl> 0, 188, 482, 927, 1159, 996, 243, 0, 0, 697, 956, 1001, 1170,~

De este gráfico se pueden destacar varias cosas. La primera de ellas es que la venta de vehículos presenta con bastante frecuencias días con cero registros nuevos, aspecto que se indagará más adelante. Asimismo, parece que las ventas medias se preservan en la mayor parte del año, con un pequeño pico al finalizar el primer trimestre y otro más destacado finalizando el año. Asimismo, se puede ver que el número de vehículos registrados en el RUNT parece tener un decenso a partir del año 2016, pues antes de este año es frecuente que se superasen los mil carros registrados por día, toda vez que a partir de este año esto pasa a ser menos frecuente. Así, considerando estos datos, se obtienen los siguientes resúmenes numéricos para el número de vehículos registrado por día:

Parámetro Valor
Media 782.17
Desviación estándar 551.16
Mínimo 0
Primer cuantil (Q1) 293
Mediana (Q2) 865.5
Tercer cuantil (Q3) 1,173
Máximo (Q4) 3,603
Rango intercuartídico 880
Coeficiente de variación 0.7
Coeficiente de asimetría 0.05
Curtosis 0.35

Como se observa, cada día entre los años 2012 y 2017 (inclusive) se registraron 782.17 vehículos en el RUNT en promedio, con una desviación estándar de 551.16 vehículos por día, y presentando un mínimo en cero vehículos por día (lo cual sucede durante varios días como se podrá verificar más adelante), y un máximo de 3,603 vehículos, lo cual ocurrió el 29 de diciembre del 2016. Además, se tiene que la mediana se da en 865.5 vehículos, lo que quiere decir que en al menos la mitad de los días del periodo mencionado se registraron 366 vehículos o más, y en el resto de días 365 vehículos o menos. Por último, se debe destacar que el coeficiente de variación es de 0.7 (70%), lo que muestra que el promedio no es representativo del conjunto de datos; asimismo, el coeficiente de asimetría es de 0.05, lo cual muestra que los datos están concentrados hacia el promedio de 782.17 vehículos registrados por día en el RUNT, pero con una ligera tendencia hacia un menor número de registros diarios, toda vez que la curtosis de 0.35, lo que implica que la distribución presenta una menor cantidad de datos atípicos comparado con una distribución normal y una mayor concentración alrededor de su media. Esto se ilustra bien mediante el siguiente gráfico:

Como se aprecia, lo más frecuente es que en un día se inscriban en el RUNT entre cero y 124 vehpiculos aproximadamente, ya que esto sucedió en 422 de los 2,192 días que abarca el periodo de interés, seguido por entre 746 y 870 vehículos por día, pues en 239 días se registraron un número de vehículos incluido en tal intervalo. De la misma forma, destaca el hecho de que hay pocos días que tengan dos mil o más vehículos registrados por día.

Ahora bien, con el objetivo de entender mejor la dinámica de venta de vehículos, vale la pena observar el comportamiento por mes, año, semana y día de la semana, para lo cual se van a crear tales variables auxiliares con ayuda de \(\color{blue}{\textsf{R}}\), lo cual deja la estructura de la base de datos como sigue:

## Rows: 2,192
## Columns: 7
## $ Fecha      <date> 2012-01-01, 2012-01-02, 2012-01-03, 2012-01-04, 2012-01-05~
## $ Unidades   <dbl> 0, 188, 482, 927, 1159, 996, 243, 0, 0, 697, 956, 1001, 117~
## $ dia        <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ~
## $ mes        <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ anno       <dbl> 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012,~
## $ dia_semana <dbl> 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6,~
## $ semana     <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,~

Y con esto, se va a revisar el comportamiento por mes entre el 2012 y el 2017 (inclusive) del registro de vehículos en el RUNT mediante la siguiente serie de tiempo:

## `summarise()` has grouped output by 'anno'. You can override using the `.groups` argument.
## List of 93
##  $ line                      :List of 6
##   ..$ colour       : chr "black"
##   ..$ size         : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                      :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ size         : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                      :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                     : NULL
##  $ aspect.ratio              : NULL
##  $ axis.title                : NULL
##  $ axis.title.x              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top          :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom       : NULL
##  $ axis.title.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left         : NULL
##  $ axis.title.y.right        :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top           :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom        : NULL
##  $ axis.text.y               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left          : NULL
##  $ axis.text.y.right         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                :List of 6
##   ..$ colour       : chr "grey70"
##   ..$ size         : 'rel' num 0.5
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ axis.ticks.x              : NULL
##  $ axis.ticks.x.top          : NULL
##  $ axis.ticks.x.bottom       : NULL
##  $ axis.ticks.y              : NULL
##  $ axis.ticks.y.left         : NULL
##  $ axis.ticks.y.right        : NULL
##  $ axis.ticks.length         : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x       : NULL
##  $ axis.ticks.length.x.top   : NULL
##  $ axis.ticks.length.x.bottom: NULL
##  $ axis.ticks.length.y       : NULL
##  $ axis.ticks.length.y.left  : NULL
##  $ axis.ticks.length.y.right : NULL
##  $ axis.line                 : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x               : NULL
##  $ axis.line.x.top           : NULL
##  $ axis.line.x.bottom        : NULL
##  $ axis.line.y               : NULL
##  $ axis.line.y.left          : NULL
##  $ axis.line.y.right         : NULL
##  $ legend.background         :List of 5
##   ..$ fill         : NULL
##   ..$ colour       : logi NA
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ legend.margin             : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing            : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x          : NULL
##  $ legend.spacing.y          : NULL
##  $ legend.key                :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : logi NA
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ legend.key.size           : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height         : NULL
##  $ legend.key.width          : NULL
##  $ legend.text               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.align         : NULL
##  $ legend.title              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.align        : NULL
##  $ legend.position           : chr "right"
##  $ legend.direction          : NULL
##  $ legend.justification      : chr "center"
##  $ legend.box                : NULL
##  $ legend.box.just           : NULL
##  $ legend.box.margin         : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background     : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing        : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ panel.background          :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : logi NA
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ panel.border              :List of 5
##   ..$ fill         : logi NA
##   ..$ colour       : chr "grey70"
##   ..$ size         : 'rel' num 1
##   ..$ linetype     : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ panel.spacing             : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ panel.spacing.x           : NULL
##  $ panel.spacing.y           : NULL
##  $ panel.grid                :List of 6
##   ..$ colour       : chr "grey87"
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major          :List of 6
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.5
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.minor          :List of 6
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.25
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major.x        : NULL
##  $ panel.grid.major.y        : NULL
##  $ panel.grid.minor.x        : NULL
##  $ panel.grid.minor.y        : NULL
##  $ panel.ontop               : logi FALSE
##  $ plot.background           :List of 5
##   ..$ fill         : NULL
##   ..$ colour       : chr "white"
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ plot.title                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.title.position       : chr "panel"
##  $ plot.subtitle             :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : num 1
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 5.5points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption.position     : chr "panel"
##  $ plot.tag                  :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.tag.position         : chr "topleft"
##  $ plot.margin               : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ strip.background          :List of 5
##   ..$ fill         : chr "grey70"
##   ..$ colour       : logi NA
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ strip.background.x        : NULL
##  $ strip.background.y        : NULL
##  $ strip.placement           : chr "inside"
##  $ strip.text                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "white"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.x              : NULL
##  $ strip.text.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.switch.pad.grid     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.switch.pad.wrap     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.text.y.left         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE

Y como se puede observar, no se puede hablar de que haya una cantidad semejante de vehículos vendidos por mes, ya que en cada año se puede observar que hay una tendencia a la baja al iniciar en el año, pues en cada uno de los meses de enero hay un mínimo de vehículos registrados en el RUNT para sus respectivos años, ocurriendo luego un incremento hacia los meses de marzo, abril y mayo para mantenerse en niveles semejantes hasta que se presenta un máximo en el mes de diciembre, siendo el más destacado el del año 2014, ya que en dicho diciembre se registraron 40,518 vehículos. Así mismo, se evidencia nuevamente una tendencia bajista en el comportamiento global, ya que hay un menor número de registros hacia los años 2018 y 2017 comparado con los demás, siendo 2014 el año con mejores registros, como se verá más adelante. Ahora, se va a analizar el número de vehículos registrados por mes sin importar el año.

Y se observa algo que fue confirmado previamente y es que diciembre es el mes con más registros diarios en el RUNT, toda vez que enero es el que menos. Asimismo, se observa que en el resto de meses se estabiliza aproximadamente el registro con al menos de 15,000 registros por mes, siendo febrero y una excepción probablemente por una recuperación luego del mínimo de enero.

2 Creación de más variables

Con el fin de generar un modelo de predicción de vehículos registrados en el RUNT durante en el 2018, se van a crear algunas variables adicionales que podrían incidir positivamente en la forma en la que los diferentes modelos a plantear trabajar. Se debe tener en cuenta que lo buenas que resulten dichas variables solo será descubierto una vez se generen los diferentes modelos.

2.1 TRM del día.

Colombia es un país con un débil aparato productivo de vehículos, lo cual se refleja en que en el 2019 se produjeron solo 127,541 vehículos en Colombia (lo cual resulta bajo comparado con los más de 3.9 millones de vehículos fabricados en México) y que contraste con los 223,755 vehículos de uso particular que fueron vendidos en el país durante el mismo año [1]. En ese sentido, es fundamental para abastecer la demanda de vehículos del país buscar en los mercados internacionales tales vehículos, y así, teniendo en cuenta que estas operaciones se tranzan generalmente dólares estadounidenses (USD), se puede considerar el precio de esta divisa en cada día, para lo cual resulta útil consultar el histórico de la tasa representativa del mercado (TRM) calculado por el Banco de la República al final de cada día [2].

2.2 Elementos de la fecha

Para poder identificar patrones estacionarios y otros asociados con el tiempo, se van a crear las siguientes variables:

  • Día. Identifica el día del mes de cada fecha.
  • Mes. Identifica el mes del año de cada fecha.
  • Año. Identifica el año de cada fecha.
  • Día de la semana. Identifica el día de la semana de cada fecha (ej.: lunes, martes, miércoles, etc.)
  • Semana del año. Identifica la semana del año asociada a cada fecha, considerando que los primeros siete días del año siempre conformarán la primera semana sin importar el día de la semana asociado a cada uno de estos.

2.3 Días no laborales

La mayoría de puntos del país donde es posible realizar un registro al RUNT solo operan en días laborales, es decir, entre el lunes y el sábado de cada semana, con la excepción de aquellos días que sean festivos, por lo que es importante identificar dichos días para que el modelo pueda incorporarlos y trabajar con ellos. Nótese que es de utilidad tener en consideración los días festivos y los domingos simultáneamente en una sola variable, ya que tenerlas separadas podría implicar una redundancia.

3 Generación de la base de datos de 2018

4 Generación de un modelo

A continuación se van a implentar diferentes técnicas de aprendizaje automático para realizar regresiones que permitan predecir la cantidad de vehículos que van a ser registrados diariamente en el RUNT. En la mayoría de ellos se va a apelar al paquete \(\color{purple}{\texttt{caret}}\) del software de programación especializado en estadística \(\color{blue}{\textsf{R}}\), el cual permite de forma sencilla implementar los diferentes modelos y verificarlos usando cross validation, que, en particular, será aplicado empleando diez iteraciones.

## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift

4.1 Regresión lineal múltiple

## 
## Call:
## lm(formula = Unidades ~ ., data = db, subset = -ind.vl)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1476.42  -236.47    10.07   205.34  2365.35 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.272e+04  2.507e+04   2.103 0.035603 *  
## dia         -3.862e+00  4.388e+00  -0.880 0.378828    
## mes         -4.847e+02  1.301e+02  -3.724 0.000202 ***
## anno        -2.600e+01  1.249e+01  -2.081 0.037546 *  
## dia_semana  -5.424e+01  5.631e+00  -9.632  < 2e-16 ***
## semana       1.158e+02  2.994e+01   3.868 0.000114 ***
## TRM         -5.307e-02  3.919e-02  -1.354 0.175874    
## Laboral      1.132e+03  2.874e+01  39.379  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 363.5 on 1636 degrees of freedom
## Multiple R-squared:  0.5682, Adjusted R-squared:  0.5663 
## F-statistic: 307.5 on 7 and 1636 DF,  p-value: < 2.2e-16

Como se puede observar, el valor del \(R^2\) que se obtiene para este modelo es de \(R^2 = 0.5682\), y la versión ajustada es \(R^2_{adj} = 0.5663\), los cuales son valores regulares que van a tratar de ser mejorados de cara al modelo que finalmente sea empleado. Sin embargo, debe tenerse en cuenta que la regres

4.2 K vecinos más cercanos

Se va a emplear el método de los k vecinos más cercanos, conocido como KNN por sus siglas en inglés (k nearest neighbors), y esto será realizado en dos etapas: la primera de ellas ignorando el preprocesamiento, es decir, usando los datos puros sin ninguna especie de modificación y luego preprocesándolos, lo cual implica que se los va a ajustar de acuerdo a sus medias y varianzas.

4.2.1 KNN. Sin preprocesamiento.

## k-Nearest Neighbors 
## 
## 2192 samples
##    7 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1972, 1972, 1972, 1973, 1974, 1974, ... 
## Resampling results across tuning parameters:
## 
##   k  RMSE      Rsquared    MAE     
##   5  549.7380  0.07118280  445.5994
##   7  551.7919  0.05728017  450.5152
##   9  547.5985  0.05481618  450.6303
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 9.

Y como se puede ver, para tres valores diferentes del número de vecinos a considerar, se obtienes valores de \(R^2\) bastante bajos, lo cual impide que las variables regresoras consideradas sean útiles para explicar la variabilidad de la variable unidades, que es la que quiere ser predicha para cada día del 2018, lo cual lleva a que este modelo sea descartado inmediatamente.

4.2.2 KNN. Empleando procesamiento.

## k-Nearest Neighbors 
## 
## 2192 samples
##    7 predictor
## 
## Pre-processing: centered (7), scaled (7) 
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1973, 1974, 1973, 1974, 1972, 1972, ... 
## Resampling results across tuning parameters:
## 
##   k  RMSE      Rsquared   MAE     
##   5  235.9529  0.8206710  151.5282
##   7  244.7898  0.8080335  159.8338
##   9  249.0958  0.8016481  162.3423
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 5.

Y se evidencia una notable mejoría que en el caso en el que el preprocesamiento no fue realizado, pues para cada una de las tres iteraciones evaluadas (\(k = 5, \ 7, \ 9\)), se obtuvieron valores de \(R^2\) de al menos \(0.80\), lo cual es bueno. Sin embargo, es interesante evaluar si es posible mejorar estos valores al ensayar aún más iteraciones, para lo cual se generará un grilla que posibilite evaluar valores de \(k\) entre uno y cien.

## k-Nearest Neighbors 
## 
## 2192 samples
##    7 predictor
## 
## Pre-processing: centered (7), scaled (7) 
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1974, 1973, 1972, 1973, 1972, 1974, ... 
## Resampling results across tuning parameters:
## 
##   k    RMSE      Rsquared   MAE     
##     1  364.9012  0.6147823  221.9877
##     2  294.5513  0.7167016  191.8319
##     3  253.6985  0.7896485  161.0203
##     4  239.4396  0.8146969  151.3786
##     5  239.8894  0.8146820  152.3340
##     6  242.8743  0.8107085  154.3526
##     7  250.1736  0.7992315  160.4548
##     8  251.5742  0.7977750  161.1521
##     9  252.0921  0.7973813  162.1631
##    10  255.0247  0.7927626  163.2096
##    11  256.2165  0.7911563  163.9221
##    12  257.5579  0.7891872  165.1572
##    13  259.2458  0.7865080  166.1804
##    14  259.8765  0.7856286  166.7189
##    15  261.7247  0.7829232  167.7644
##    16  263.7267  0.7795008  169.7157
##    17  265.7980  0.7759884  171.2040
##    18  266.7527  0.7744520  172.4687
##    19  269.7380  0.7693160  174.6506
##    20  271.3869  0.7664559  175.8664
##    21  272.6526  0.7642889  177.2821
##    22  273.8698  0.7623410  178.5116
##    23  276.5495  0.7573042  180.6588
##    24  278.4118  0.7539448  182.2191
##    25  280.5980  0.7498046  184.1503
##    26  282.6332  0.7459321  185.5769
##    27  284.7254  0.7419718  187.0444
##    28  286.0058  0.7395977  188.3449
##    29  287.2847  0.7371309  189.5863
##    30  288.6297  0.7345423  190.7035
##    31  289.6247  0.7325769  191.3937
##    32  290.5061  0.7308618  192.2988
##    33  291.4238  0.7290265  192.9013
##    34  292.4923  0.7270481  193.8316
##    35  293.7416  0.7245328  194.6898
##    36  294.8417  0.7223872  195.4745
##    37  296.2751  0.7195671  196.5643
##    38  296.9895  0.7181829  197.1730
##    39  298.1332  0.7157678  197.8629
##    40  298.4212  0.7152313  198.2815
##    41  299.4070  0.7132670  199.0347
##    42  300.3155  0.7114865  199.6131
##    43  300.9991  0.7101131  200.2246
##    44  301.6631  0.7087567  200.6571
##    45  302.5101  0.7070668  201.3817
##    46  303.1753  0.7056962  201.7712
##    47  303.5462  0.7050158  202.1197
##    48  304.6728  0.7027022  202.9523
##    49  305.6037  0.7007749  203.6935
##    50  306.1753  0.6996739  204.2133
##    51  307.0041  0.6979600  204.8573
##    52  307.6170  0.6967378  205.3007
##    53  308.5535  0.6948285  206.0160
##    54  309.5084  0.6928145  206.4578
##    55  310.1746  0.6913417  206.9392
##    56  310.4974  0.6906596  207.1171
##    57  311.0373  0.6896012  207.6448
##    58  311.5888  0.6884889  208.0582
##    59  312.0377  0.6875224  208.2781
##    60  312.3928  0.6868416  208.5496
##    61  313.2718  0.6850254  209.1972
##    62  313.8122  0.6838720  209.6043
##    63  314.3966  0.6826546  210.0531
##    64  315.0505  0.6813162  210.4322
##    65  315.8836  0.6795859  211.0887
##    66  316.2482  0.6788436  211.2581
##    67  316.8568  0.6776138  211.7487
##    68  317.3074  0.6766632  212.1710
##    69  317.9948  0.6751975  212.6184
##    70  318.6713  0.6738046  213.2127
##    71  319.0337  0.6730424  213.5417
##    72  319.6610  0.6717222  214.1211
##    73  320.4121  0.6700845  214.5604
##    74  320.8975  0.6690891  214.8927
##    75  321.4415  0.6679196  215.3304
##    76  321.7843  0.6672472  215.5780
##    77  322.3344  0.6660952  215.9835
##    78  322.8712  0.6649224  216.4915
##    79  323.2004  0.6642455  216.8232
##    80  323.6102  0.6633839  217.3017
##    81  324.0839  0.6624108  217.8333
##    82  324.5861  0.6613398  218.3487
##    83  325.0923  0.6602986  218.7960
##    84  325.5854  0.6592375  219.1625
##    85  325.9174  0.6585920  219.5421
##    86  326.1745  0.6580900  219.7940
##    87  326.6130  0.6572084  220.1208
##    88  327.2064  0.6559197  220.6473
##    89  327.5536  0.6552278  220.8923
##    90  327.8561  0.6546368  221.1850
##    91  328.4176  0.6534406  221.6388
##    92  329.1359  0.6518701  222.1813
##    93  329.3746  0.6514676  222.5226
##    94  329.7045  0.6507883  222.8152
##    95  330.2199  0.6496984  223.2702
##    96  330.6807  0.6487372  223.6576
##    97  331.1840  0.6477070  224.2317
##    98  331.5465  0.6469509  224.6680
##    99  331.8661  0.6463250  224.9462
##   100  332.3791  0.6452812  225.4051
##   101  332.9560  0.6440914  225.8677
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 4.

Y como se puede observar en la tabla anterior, los mejores valores para el número de vecinos a considerar, basados en el \(R^2\) son \(k = 4\) y \(k = 5\), pues hay un empate con esta métrica. No obstante, al considerar las otras dos métricas: RMSE y MSE, los cuales entre más bajos mejores son, se determina que el número óptimo de vecinos a considerar es \(k = 4\). A continuación se observa un gráfico que permite visualizar el valor de la raíz del error cuádratico medio como función del número de vecinos empleado.

4.3 Árboles de decisión

## CART 
## 
## 2192 samples
##    7 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1972, 1972, 1973, 1973, 1974, 1972, ... 
## Resampling results across tuning parameters:
## 
##   maxdepth  RMSE      Rsquared   MAE     
##   1         401.2074  0.4699951  275.7741
##   2         307.1483  0.6894374  195.6781
##   3         285.9566  0.7316715  187.8941
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was maxdepth = 3.

Ahora bien, al implementar árboles de decisión, se evidencia que el valor del \(R^2\) varía notablemente según la nivel máximo permitida, mejorando progresivamente al evaluar entre uno y tres (inclusive) nodos, alcanzando un pico \(R^2 = 0.7317\) cuando se consideran tres nodos como máximo. No obstante, para poder tener una mejor panorámica del alcance de este modelo, se va a generar una grilla que permita evaluar más modelos con árboles de decisión para así escoger el número óptimo de nivel máximo permitida.

## CART 
## 
## 2192 samples
##    7 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1974, 1973, 1973, 1973, 1973, 1972, ... 
## Resampling results across tuning parameters:
## 
##   maxdepth  RMSE      Rsquared   MAE     
##    1        401.9204  0.4680477  275.7957
##    2        307.9308  0.6881483  195.7286
##    3        284.8798  0.7340180  186.9455
##    4        266.7102  0.7666940  174.6776
##    5        249.7927  0.7954650  156.7890
##    6        237.1811  0.8156399  145.4569
##    7        242.4209  0.8071233  146.2552
##    8        242.4209  0.8071233  146.2552
##    9        242.4209  0.8071233  146.2552
##   10        242.4209  0.8071233  146.2552
##   11        242.4209  0.8071233  146.2552
##   12        242.4209  0.8071233  146.2552
##   13        242.4209  0.8071233  146.2552
##   14        242.4209  0.8071233  146.2552
##   15        242.4209  0.8071233  146.2552
##   16        242.4209  0.8071233  146.2552
##   17        242.4209  0.8071233  146.2552
##   18        242.4209  0.8071233  146.2552
##   19        242.4209  0.8071233  146.2552
##   20        242.4209  0.8071233  146.2552
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was maxdepth = 6.

Y se observa que el mejor modelo es aquel que considera una profundida máxima de seis, puesto que su \(R^2 = 0.8156\). Empero, este modelo no va a poder ser finalmente evaluado teniendo en cuenta que no es bueno para poder hacer predicciones fuera de su rango de generación, lo que quiere decir en este caso que sería bastante bueno para poder predecir cuál es la cantidad de vehículos registrados en el RUNT para días faltantes entre el 2012 y el 2017, pero no para evaluar más allá de estos años, lo que quiere decir que proyectar valores para el 2018 no va a ser útil con este método.

5 Modelo

6 Borrador

7 Referencias

[1] PROCOLOMBIA. “Industria automotriz en Colombia”. Procolombia. https://www.colombiatrade.com.co/noticias/industria-automotriz-en-colombia (accedido el 8 de enero de 2022).

[2] Banco de la República de Colombia. “Tasa representativa del mercado (TRM - peso por dólar)”. Banco de la República. https://www.banrep.gov.co/es/estadisticas/trm (accedido el 8 de enero de 2022).